package com.warom.sdg.util;

import java.util.HashMap;
import java.util.Map;

/**
 * PLC地址与单位映射工具类
 * 用于根据Modbus地址或数据类型自动确定对应的单位
 */
public class PlcUnitMapper {

    // 地址到单位的映射表
    private static final Map<String, String> ADDRESS_UNIT_MAP = new HashMap<>();
    
    // 数据类型到单位的映射表
    private static final Map<String, String> TYPE_UNIT_MAP = new HashMap<>();
    
    // 初始化映射表
    static {
        // 地址对应的单位映射（根据项目需求配置）
        // 温度相关地址
        ADDRESS_UNIT_MAP.put("40001", "℃");    // 温度传感器1
        ADDRESS_UNIT_MAP.put("40002", "%");     // 湿度传感器1
        ADDRESS_UNIT_MAP.put("40003", "kPa");   // 压力传感器
        ADDRESS_UNIT_MAP.put("40004", "kg");    // 重量传感器
        ADDRESS_UNIT_MAP.put("40005", "mm");    // 液位传感器
        ADDRESS_UNIT_MAP.put("40006", "L/min"); // 流量传感器
        ADDRESS_UNIT_MAP.put("40007", "rpm");   // 转速传感器
        ADDRESS_UNIT_MAP.put("40008", "m/s");   // 速度传感器
        ADDRESS_UNIT_MAP.put("40009", "A");     // 电流传感器
        ADDRESS_UNIT_MAP.put("40010", "V");     // 电压传感器
        ADDRESS_UNIT_MAP.put("40011", "KW");    // 功率传感器
        ADDRESS_UNIT_MAP.put("40012", "Hz");    // 频率传感器
        
        // 数字量地址通常没有单位
        ADDRESS_UNIT_MAP.put("00001", "");      // 门状态
        ADDRESS_UNIT_MAP.put("00002", "");      // 设备运行状态
        ADDRESS_UNIT_MAP.put("00003", "");      // 报警状态
        
        // 根据数据类型确定单位
        TYPE_UNIT_MAP.put("温度", "℃");
        TYPE_UNIT_MAP.put("湿度", "%");
        TYPE_UNIT_MAP.put("压力", "kPa");
        TYPE_UNIT_MAP.put("重量", "kg");
        TYPE_UNIT_MAP.put("质量", "kg");
        TYPE_UNIT_MAP.put("液位", "mm");
        TYPE_UNIT_MAP.put("水位", "mm");
        TYPE_UNIT_MAP.put("流量", "L/min");
        TYPE_UNIT_MAP.put("转速", "rpm");
        TYPE_UNIT_MAP.put("速度", "m/s");
        TYPE_UNIT_MAP.put("电流", "A");
        TYPE_UNIT_MAP.put("电压", "V");
        TYPE_UNIT_MAP.put("功率", "KW");
        TYPE_UNIT_MAP.put("频率", "Hz");
        TYPE_UNIT_MAP.put("开关量", "");
        TYPE_UNIT_MAP.put("状态", "");
    }
    
    /**
     * 根据地址获取对应的单位
     * @param address Modbus地址
     * @return 单位字符串，如果未找到返回空字符串
     */
    public static String getUnitByAddress(String address) {
        String unit = ADDRESS_UNIT_MAP.get(address);
        return unit != null ? unit : "";
    }
    
    /**
     * 根据数据类型获取对应的单位
     * @param type 数据类型描述
     * @return 单位字符串，如果未找到返回空字符串
     */
    public static String getUnitByType(String type) {
        if (type == null || type.isEmpty()) {
            return "";
        }
        
        // 遍历所有已知类型，检查type是否包含关键词
        for (Map.Entry<String, String> entry : TYPE_UNIT_MAP.entrySet()) {
            if (type.contains(entry.getKey())) {
                return entry.getValue();
            }
        }
        
        return "";
    }
    
    /**
     * 智能确定单位
     * 首先尝试根据地址获取，如果未找到则尝试根据类型获取
     * @param address Modbus地址
     * @param type 数据类型描述
     * @return 单位字符串，如果都未找到返回空字符串
     */
    public static String determineUnit(String address, String type) {
        // 首先尝试根据地址获取
        String unit = getUnitByAddress(address);
        
        // 如果地址未匹配到单位，则尝试根据类型获取
        if (unit.isEmpty() && type != null && !type.isEmpty()) {
            unit = getUnitByType(type);
        }
        
        return unit;
    }
} 